
/**
 * @file Enseignement.h
 * @brief Fichier d'entête du module Enseignement.
 *
 * @author Mohammad NOROUZZADEH, Lotfi, Saleh
 */
#ifndef _ENSEIGNEMENT_H
#define _ENSEIGNEMENT_H


/* ********************************************************************* */
/*                                                                       */
/*                       Librairies de Enseignement                                */
/*                                                                       */
/* ********************************************************************* */

#include <stdlib.h>
#include <assert.h>
#include <stdio.h>
#include <gtk/gtk.h>

#include "Enseignant.h"
#include "UE.h"
#include "Etudiant.h"
#include "IP.h"
#include "Salle.h"

/* ********************************************************************* */
/*                                                                       */
/*                        Définitions de types                           */
/*                                                                       */
/* ********************************************************************* */


/**
 * @struct Enseignement
 * @brief Structure utilisée pour la gestion d'une Enseignement.
 *
 * Cette structure est utilisée pour gérer .Les champs de cette structures
   doivent être modifiés ou lus par les accesseurs et mutateurs.
 */
struct sEnseignement
	{
        int numEnseignement;
		int numEns;
		int codeUE;
		int type; /*CM=1,TD=2,TP=3,si CM groupe=0*/
		char * date;
		int duree;
		int numSalle;
		char groupe;
	};

/**
 * @typedef Enseignement
 * @brief Redéfinit la structure sEnseignement
 */
typedef struct sEnseignement Enseignement;

/**
 * @struct sTabEnseignement
 * @brief Structure utilisée pour la gestion d'une Enseignement.
 *
 * Cette structure est utilisée pour gérer .Les champs de cette structures
   doivent être modifiés ou lus par les accesseurs et mutateurs.
 */
struct  sTabEnseignement
{
    Enseignement ** tabEnseignement;
    int nbEnseignement;
};


/**
 * @typedef sTabEnseignement
 * @brief Redéfinit la structure TabEnseignement
 */
typedef struct  sTabEnseignement TabEnseignement;


/**
 * @fn void initEnseignement(Enseignement * Enseignement,  int numEns,  int codeUE,  char * date, int numSalle,  char groupe);
 * @brief Initialise un Enseignement.
   initEnseignement initialise CodeUE, Intitule et Sequence (après vérification) de la structure Enseignement

 * @param[in, out] ue Pointeur vers l'Enseignement à initialiser.
 * @param[in] numEns de l'Enseignement.
 * @param[in] codeUE de l'Enseignement.
 * @param[in] date de l'Enseignement.
 * @param[in] numSalle de l'Enseignement.
 * @param[in] groupe de l'Enseignement.
 * @return 0 si tout est OK
 */



void initEnseignement(Enseignement * Enseignement, int numEnseignement,  int numEns,  int codeUE, int type,  char * date, int duree,  int numSalle,  char groupe);

/**
 * @fn void libEnseignement(Enseignement * Enseignement);
 * @brief Libere un Enseignement en mémoire.

 * @param[in, out] Enseignement Pointeur vers l'Enseignement.
 * @return 0 si tout est OK
 */
void libEnseignement(Enseignement * Enseignement);

/**
 * @fn Enseignement * creEnseignement( int numEns,  int codeUE,  char * date, int numSalle,  char groupe);
 * @brief Crée un Enseignement en mémoire.

 * @param[in] numEns de l'Enseignement.
 * @param[in] codeUE de l'Enseignement.
 * @param[in] date de l'Enseignement.
 * @param[in] numSalle de l'Enseignement.
 * @param[in] groupe de l'Enseignement.
 * @return un pointeur vers un Enseignement
 */
Enseignement * creEnseignement(  int numEnseignement, int numEns,  int codeUE, int type,  char * date, int duree, int numSalle,  char groupe);

/**
 * @fn void detEnseignement(Enseignement ** Enseignement);
 * @brief Détruit un Enseignement en mémoire.

 * @param[in, out] Enseignement Pointeur vers l'Enseignement.
 * @return 0 si tout est OK
 */
void detEnseignement(Enseignement ** Enseignement);

/* ******************************************************************** */
/*																		*/
/*           Accesseurs et Mutateurs de la structure Enseignement                 */
/*																		*/
/* ******************************************************************** */

/**
 * @fn int getNumEns_Enseignement( Enseignement * Enseignement);
 * @brief returner ue de Enseignement.

 * @param[in] Enseignement pointeur vers l'Enseignement.
 * @return numEns de Enseignement
 */
int getNumEns_Enseignement( Enseignement * Enseignement);

/**
 * @fn void setNumEns_Enseignement(Enseignement * Enseignement, int numEns);
 * @brief modifie le champ numEns de l'Enseignement.

 * @param[in, out] Enseignement Pointeur vers l'Enseignement.
 * @param[in] numEns de l'Enseignement.
 * @return 0 si tout est OK
 */
void setNumEns_Enseignement(Enseignement * Enseignement, int numEns);

/**
 * @fn int getCodeEU_Enseignement( Enseignement * Enseignement);
 * @brief returner codeUE de l'Enseignement.

 * @param[in] Enseignement Pointeur vers l'Enseignement.
 * @return codeUE.
 */
int getCodeEU_Enseignement( Enseignement * Enseignement);

/**
 * @fn void setCodeUE_Enseignement(Enseignement * Enseignement, int codeUE);
 * @brief modifie le codeUE de l'Enseignement.

 * @param[in, out] Enseignement Pointeur vers l'Enseignement.
 * @param[in] codeUE de l'Enseignement.
 * @return 0 si tout est OK.
 */
void setCodeUE_Enseignement(Enseignement * Enseignement, int codeUE);

/**
 * @fn char * getDate_Enseignement( Enseignement * Enseignement);
 * @brief returner date.

 * @param[in] Enseignement pointeur vers l'Enseignement.
 * @return date.
 */
char * getDate_Enseignement( Enseignement * Enseignement);

/**
 * @fn void setDate_Enseignement(Enseignement * Enseignement, char * date);
 * @brief modifie le champ date de l'Enseignement.

 * @param[in, out] Enseignement Pointeur vers l'Enseignement.
 * @param[in] date de l'Enseignement.
 * @return 0 si tout est OK.
 */
void setDate_Enseignement(Enseignement * Enseignement, char * date);

/**
 * @fn int getNumSalle( Enseignement * Enseignement);
 * @brief returner numSalle.

 * @param[in] Enseignement pointeur vers l'Enseignement.
 * @return numSalle.
 */
int getNumSalle_Enseignement( Enseignement * Enseignement);

/**
 * @fn void setNumSalle_Enseignement(Enseignement * Enseignement, int numSalle);
 * @brief modifie le champ numSalle de l'Enseignement.

 * @param[in, out] Enseignement Pointeur vers l'Enseignement.
 * @param[in] numSalle de l'Enseignement.
 * @return 0 si tout est OK.
 */
void setNumSalle_Enseignement(Enseignement * Enseignement, int numSalle);

/**
 * @fn char getGroupe_Enseignement( Enseignement * Enseignement);
 * @brief returner groupe.

 * @param[in] Enseignement pointeur vers l'Enseignement.
 * @return groupe.
 */
char getGroupe_Enseignement( Enseignement * Enseignement);

/**
 * @fn void setGroupe_Enseignement(Enseignement * Enseignement, char groupe);
 * @brief modifie le champ groupe de l'Enseignement.

 * @param[in, out] Enseignement Pointeur vers l'Enseignement.
 * @param[in] groupe de l'Enseignement.
 * @return 0 si tout est OK.
 */
void setGroupe_Enseignement(Enseignement * Enseignement, char groupe);

/**
 * @fn void affEnseignement( Enseignement * Enseignement);
 * @brief Afficher l'Enseignement.

 * @param[in] Enseignement pointeur vers l'Enseignement.
 * @return 0 si tout est OK
 */
void affEnseignement( Enseignement * Enseignement);

/* ********************************************************************* */
/*                                                                       */
/*             Fonctions relatives aux gestiond'Etu                       */
/*                                                                       */
/* ********************************************************************* */

/**
 * @fn void savEnseignementParElem( int numEns, int codeUE, char * date,  int numSalle,
                          char groupe,  char filename[]);
 * @brief saover Enseignement dans un fichier binaire.
 *
 * @param[in] numEns .
 * @param[in] codeUE .
 * @param[in] date .
 * @param[in] numSalle.
 * @param[in] groupe.
 * @param[in] filename fichier à ouvrir.
 * @return 0 si tout est OK.
 */
void savEnseignementParElem( int numEnseignement,int    codeUe, int numEns, int type, char * date,
                   int  duree,int numSalle,  char groupe);

/**
 * @fn Enseignement *recEnseignementParCode( int codeEtu,  int codeUE,  char filename[]);
 * @brief recupérer Enseignement dans un fichier binaire.
 *
 * @param[in] numEns .
 * @param[in] codeUE .
 * @param[in] filename fichier à ouvrir.
 * @return Etu s'il n'existe pas.
 * @return NULL s'il existe.
*/
Enseignement *recEnseignementParCode( int numEnseignement);

/**
 * @fn int supEnseignementParCode( int numEns,  int codeUE,  char filename[]);
 * @brief supprimer Enseignement dans un fichier binaire.
 *
 * @param[in] numEns .
 * @param[in] codeUE .
 * @param[in] filename fichier à ouvrir.
 * @return -1 s'il n'existe pas.
 * @return 0 s'il supprime.
 */
int supEnseignementParCode( int numEnseignement);

/**
 * @fn int mdfEnseignementParCode( int numEns,  int codeUE,  Enseignement *pEnseignement,  char filename[]);
 * @brief modifier Enseignement dans un fichier binaire.
 *
 * @param[in] numEns .
 * @param[in] codeUE .
 * @param[in] pEnseignement .
 * @param[in] filename fichier à ouvrir.
 * @return -1 s'il n'existe pas.
 * @return 1 s'il modifie.
 * @return 0 si non.
 */
int mdfEnseignementParCode( int numEnseignement, Enseignement *pEnseignement);

/**
 * @fn TabEnseignement * recEnseignementParUe(UE*ue);
 * @brief recupérer EnseignementParUe.
 *
 * @param[in] ue .

 * @return Enseignement s'il n'existe pas.
 * @return NULL s'il existe.
*/
TabEnseignement * recEnseignementParUe(UE*ue);

/**
 * @fn TabEtu * recEtuParEnseignement(Enseignement*enseignement);
 * @brief recupérer EtuParEnseignement.
 *
 * @param[in] uenseignemente .

 * @return tabEtu s'il n'existe pas.
 * @return NULL s'il existe.
*/
TabEtu * recEtuParEnseignement(Enseignement*enseignement);

/**
 * @fn TabEnseignement * recEnseignementParCodeUe(int    codeUe);
 * @brief recupérer recEnseignementParCodeUe.
 *
 * @param[in] codeu .

 * @return tabEnseignement s'il n'existe pas.
 * @return NULL s'il existe.
*/
TabEnseignement * recEnseignementParCodeUe(int codeUe);

/**
 * @fn TabEnseignement * recEnseignementParEnseignant(Ens * ens);
 * @brief recupérer recEnseignementParCodeUe.
 *
 * @param[in] ens .

 * @return tabenseignement s'il n'existe pas.
 * @return NULL s'il existe.
*/
TabEnseignement * recEnseignementParEnseignant(Ens * ens);

/**
 * @fn TabEnseignement * recEnseignementParNumEns(int numEns);
 * @brief recupérer recEnseignementParCodeUe.
 *
 * @param[in] numens .

 * @return tabenseignement s'il n'existe pas.
 * @return NULL s'il existe.
*/
TabEnseignement * recEnseignementParNumEns(int numEns);

/**
 * @fn TabEnseignement * recEnseignementParEtu(Etu*etu);
 * @brief recupérer recEnseignementParEtu.
 *
 * @param[in] etu.

 * @return tabenseignement s'il n'existe pas.
 * @return NULL s'il existe.
*/
TabEnseignement * recEnseignementParEtu(Etu*etu);

/**
 * @fn TabEnseignement * recEnseignementParNumEtu(int numEtu);
 * @brief recupérer recEnseignementParNumEtu.
 *
 * @param[in] numetu.

 * @return tabenseignement s'il n'existe pas.
 * @return NULL s'il existe.
*/
TabEnseignement * recEnseignementParNumEtu(int numEtu);

/**
 * @fn int modifEnseignement(Enseignement*enseignement,    Enseignement*enseignementnew);
 * @brief modifier Enseignement dans un fichier binaire.
 *
 * @param[in] Enseignement .
 * @param[in] pEnseignement .
 * @return -1 s'il n'existe pas.
 * @return 1 s'il modifie.
 * @return 0 si non.
 */
int modifEnseignement(Enseignement*enseignement,    Enseignement*enseignementnew);

/**
 * @fn int supEnseignemeent(Enseignement*enseignement);
 * @brief supprimer Enseignement dans un fichier binaire.
 *
 * @param[in] Enseignement .

 * @return 1 s'il supprimé.
 * @return 0 si non.
 */
int supEnseignemeent(Enseignement*enseignement);

/**
 * @fn int supPresenceDeDB(int numEtu,int  numEnseignement);
 * @brief supprimer PresenceDeDB
 *
 * @param[in] numEtu, numEnseignement .

 * @return 1 s'il supprimé.
 * @return 0 si non.
 */
int supPresenceDeDB(int numEtu,int  numEnseignement);

/**
 * @fn char * getEnseignementText(Enseignement*enseignement,char*separateur);
 * @brief getEnseignementText
 *
 * @param[in] Enseignement.
 * @param[in] separateur.

 * @return char * s'il existe.
 * @return NULL si non.
 */
char * getEnseignementText(Enseignement*enseignement,char*separateur);

/**
 * @fn char * recPresenceEtuAEnseignement(Etu*etu,Enseignement*enseignement);
 * @brief recPresenceEtuAEnseignement
 *
 * @param[in] Enseignement.
 * @param[in] etu.

 * @return char * s'il existe.
 * @return NULL si non.
 */
char * recPresenceEtuAEnseignement(Etu*etu,Enseignement*enseignement);

/**
 * @fn char * recPresenceEtuAEnseignementParId(int    numEtu,int  numEnseignement);
 * @brief recPresenceEtuAEnseignement
 *
 * @param[in] numEnseignement.
 * @param[in] numetu.

 * @return char * s'il existe.
 * @return NULL si non.
 */
char * recPresenceEtuAEnseignementParId(int    numEtu,int  numEnseignement);

/**
 * @fn void saveEnseignement(Enseignement*enseignement);
 * @brief saover saveEnseignement.
 *
 * @param[in] enseignement .

 * @return 0 si tout est OK.
 */
void saveEnseignement(Enseignement*enseignement);

/**
 * @fn void setPresenceEtuAEnseignement(Etu*etu,Enseignement*enseignement,char* etat);
 * @brief setPresenceEtuAEnseignement.
 *
 * @param[in] enseignement .
 * @param[in] etu.
 * @param[in] etat .

 * @return 0 si tout est OK.
 */
void setPresenceEtuAEnseignement(Etu*etu,Enseignement*enseignement,char* etat);

/**
 * @fn void setPresenceParNumEtuNumEnseignement(int numEtu,int  numEnseignement,char* etat);
 * @brief setPresenceParNumEtuNumEnseignement
 *
 * @param[in] numenseignement .
 * @param[in] numetu.
 * @param[in] etat .

 * @return 0 si tout est OK.
 */
void setPresenceParNumEtuNumEnseignement(int numEtu,int  numEnseignement,char* etat);


/**
 * @fn affEnseignement_DB( char filename[]);
 * @brief Afficher base de donnee de Enseignement .

 * @param[in] filename fichier à ouvrir.
 * @return 0 si tout est OK.
 */
void affEnseignement_DB( );

/**
 * @fn void regEnseignement() ;
 * @brief Test le module Enseignement
 */
void regEnseignement();

#endif
